package cn.jji8.patronSaint.quick.config;

import cn.jji8.patronSaint.quick.command.CommandManger;
import org.bukkit.configuration.file.YamlConfiguration;

import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

@SuppressWarnings("unused")
public class ConfigManger {
    final File file;
    final YamlConfiguration yamlConfiguration;
    final Map<String,BooleanSet> booleanSetMap = new HashMap<>();
    final Map<String,DoubleSet> doubleSetMap = new HashMap<>();
    final Map<String,IntSet> intSetMap = new HashMap<>();
    final Map<String,StringSet> stringSetMap = new HashMap<>();
    /**
     * 已一个文件的方法创建一个配置
     * */
    public ConfigManger(File file) {
        this.file = file;
        this.yamlConfiguration = YamlConfiguration.loadConfiguration(file);
    }
    /**
     * 保存配置文件
     * */
    public void save(){
        try {
            yamlConfiguration.save(file);
        } catch (IOException e) {
            e.printStackTrace();
            org.bukkit.Bukkit.getLogger().severe(file+"文件保存失败！");
        }
    }
    /**
     * 设置某个值
     * */
    public void set(String key,String value){
        yamlConfiguration.set(key,value);
        StringSet set = stringSetMap.get(key);
        if(set!=null){
            set.set(value);
        }
        save();
    }
    /**
     * 设置某个值
     * */
    public void set(String key,int value){
        yamlConfiguration.set(key,value);
        IntSet set = intSetMap.get(key);
        if(set!=null){
            set.set(value);
        }
        save();
    }
    /**
     * 设置某个值
     * */
    public void set(String key,double value){
        yamlConfiguration.set(key,value);
        DoubleSet set = doubleSetMap.get(key);
        if(set!=null){
            set.set(value);
        }
        save();
    }
    /**
     * 设置某个值
     * */
    public void set(String key,boolean value){
        yamlConfiguration.set(key,value);
        BooleanSet set = booleanSetMap.get(key);
        if(set!=null){
            set.set(value);
        }
        save();
    }
    /**
     * 加载配置，同时加载和设置此配置的命令
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public StringCommandConfig load(String key, String defaults, CommandManger commandManger, StringSet set){
        load(key,defaults,set);
        StringCommandConfig CommandConfig = new StringCommandConfig(this,key);
        commandManger.addCommand(new String[]{key},CommandConfig);
        return CommandConfig;
    }
    /**
     * 加载配置
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public void load(String key,String defaults,StringSet set){
        if(yamlConfiguration.contains(key)){
            set.set(yamlConfiguration.getString(key));
        }else {
            set.set(defaults);
            yamlConfiguration.set(key,defaults);
            save();
        }
        stringSetMap.put(key,set);
    }
    /**
     * 加载配置，同时加载和设置此配置的命令
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public BooleanCommandConfig load(String key, boolean defaults, CommandManger commandManger, BooleanSet set){
        load(key,defaults,set);
        BooleanCommandConfig CommandConfig = new BooleanCommandConfig(this,key);
        commandManger.addCommand(new String[]{key},CommandConfig);
        return CommandConfig;
    }
    /**
     * 加载配置
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public void load(String key,boolean defaults,BooleanSet set){
        if(yamlConfiguration.contains(key)){
            set.set(yamlConfiguration.getBoolean(key));
        }else {
            set.set(defaults);
            yamlConfiguration.set(key,defaults);
            save();
        }
        booleanSetMap.put(key,set);
    }
    /**
     * 加载配置，同时加载和设置此配置的命令
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public IntCommandConfig load(String key,int defaults,CommandManger commandManger,IntSet set){
        load(key,defaults,set);
        IntCommandConfig CommandConfig = new IntCommandConfig(this,key);
        commandManger.addCommand(new String[]{key},CommandConfig);
        return CommandConfig;
    }
    /**
     * 加载配置
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public void load(String key,int defaults,IntSet set){
        if(yamlConfiguration.contains(key)){
            set.set(yamlConfiguration.getInt(key));
        }else {
            set.set(defaults);
            yamlConfiguration.set(key,defaults);
            save();
        }
        intSetMap.put(key,set);
    }
    /**
     * 加载配置，同时加载和设置此配置的命令
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public DoubleCommandConfig load(String key, double defaults, CommandManger commandManger, DoubleSet set){
        load(key,defaults,set);
        DoubleCommandConfig CommandConfig = new DoubleCommandConfig(this,key);
        commandManger.addCommand(new String[]{key},CommandConfig);
        return CommandConfig;
    }
    /**
     * 加载配置
     * @param defaults key在没有被设置其他值时默认对应的值
     * */
    public void load(String key,double defaults,DoubleSet set){
        if(yamlConfiguration.contains(key)){
            set.set(yamlConfiguration.getDouble(key));
        }else {
            set.set(defaults);
            yamlConfiguration.set(key,defaults);
            save();
        }
        doubleSetMap.put(key,set);
    }
}
